<?php

$this->useClass('RL_View');

class RL_View_Template extends RL_View
{
	/**
	 * template название шаблона.
	 *
	 * @var string
	 * @access public
	 */
	public $template = '';
	public $skin = NULL;

	public $data = array();
	public $content_type = 'html';
	public function get( $key )
	/**
	* Получить значение (намеренно без ссылки)
	*
	* @param string $key
	* @return mixed
	*/
	{
		return isset($this->data[$key]) ? $this->data[$key] : "" ;
	}

	public function set($key, $value, $type=NULL)
	/**
	 * Установить значение ключу
	 *
	 * @param string $key
	 * @param mixed $value
	 */
	{
		$this->data[$key] = $value;
		$this->data[TPL_DOMAIN_TYPE][$key] = $type;
	}
	public function setRef( $key, &$ref, $type=NULL )
	/**
	* установить значение ссылкой
	*
	* @param string $key
	* @param mixed $ref
	*/
	{
		$this->data[$key] = &$ref;
		$this->data[TPL_DOMAIN_TYPE][$key] = $type;
	}

	public function append($key, $value)
	/**
	* дописать в конец
	*
	* @param string $key
	* @param mixed $value
	*/
	{
		if (!isset($this->data[$key])) {
			$this->data[$key] = '';
			$this->data[TPL_DOMAIN_TYPE][$key] = $this->content_type;
		}
  	$this->data[$key] .= $value;
	}

	public function is( $key )
	/**
	* true, если этот ключ хоть что-то значил
	*
	* @param string $key
	* @return bool
	*/
	{
		return isset( $this->data[$key] );
	}

	public function free( $key = NULL )
	/**
	 * очистка домена или unset переменной
	 *
	 * @param string $key
	 */
	{
		if ($key === NULL) {
			$this->data = array();
		} elseif( is_array($key) ) {
			foreach($key as $k) {
				unset( $this->data[$k], $this->data[TPL_DOMAIN_TYPE][$k] );
			}
		} else {
			unset( $this->data[$key], $this->data[TPL_DOMAIN_TYPE][$k] );
		}
	}
	public function load($data)
	/**
	* Загрузка массива в ключи
	*
	* @param array $data
	*/
	{
		if (isset($data[TPL_DOMAIN_TYPE])) {
			$ts = $data[TPL_DOMAIN_TYPE];
			unset($data[TPL_DOMAIN_TYPE]);
		} else {
			$ts = array();
		}

	    foreach($data as $k=>$v) {
    		$this->set( $k, $v );
    	}

		$this->data[TPL_DOMAIN_TYPE] = $ts + $this->data[TPL_DOMAIN_TYPE];
	}


	public function init ()
	{
		$this->tpl = $this->ctx->tpl;
	} // end of function init

	public function getTemplate ()
	{
		return $this->template;
	} // end of function getTemplate

	public function setSkin ($skin_name='')
	{
		$this->tpl->setSkin($skin_name);
	} // end of method setSkin

	public function setTemplate ($value)
	{
		$this->template = $value;
		return $this;
	} // end of function setTemplate

	// --- widgets --- {{{
	public function renderWidgets ($widgets)
	{
		foreach ($widgets as $widget) {
			if (isset($widget)) $widget->renderWidget($this);
		}
	} // end of function renderWidgets
	// --- widgets --- }}}

	public function getContent ()
	{
		// FIXME : 2007-11-29 : lucky
		// нужно как-то кешировать
		//if (!isset($this->out)) {
			// --- widgets --- {{{
			if (isset($this->data['__widgets__'])) $this->renderWidgets($this->data['__widgets__']);
			// --- widgets --- }}}

			//HACK : 2007-12-17 : lucky
			// нужно сохранить текущее состояние шаблонных переменных.
			/* */$d = $this->ctx->tpl->domain;

			$this->ctx->tpl->load($this->data);
			$this->ctx->tpl->content_type = $this->content_type;
			$out = $this->ctx->tpl->parse($this->template);

			//HACK : 2007-12-17 : lucky
			// нужно восстановить прежнее состояние шаблонных переменных.
			/* */$this->ctx->tpl->domain = $d;
			/* */unset($d);


			// --- tidy --- {{{
			// HACK : 2007-10-17 : lucky
			// use Tidy
			// нужно уметь выводить контент через фильтры
			if (isset($this->ctx->rh->GET['debug_tidy']) && $this->getMeta()->mime_type === 'text/html' && class_exists('tidy')) {
				// Specify configuration
				$config = array(
									'indent'         => true,
									'wrap'           => 1000,
								);
				// Tidy
				$tidy = new tidy;
				$tidy->parseString($out, $config, 'utf8');
				$tidy->cleanRepair();
				$out = tidy_get_output($tidy);
			}
			// --- tidy --- }}}
			$this->out = $out;
		//}

		return $this->out;
	} // end of function render

	public function getDataStream ()
	{
		$this->ctx->rh->useClass('RL_Stream');
		// парсим шаблон, и получаем html
		// TODO : 2007-08-06 : lucky
		// тут можно воткнуть Cache
		$stream = RL_Stream::create($this->ctx, 'String');
		$stream->setString($this->getContent());
		return $stream;
	} // end of function getDataStream

	public function __toString ()
	{
		return $this->getContent();
	} // end of function __toString

	public function buildMeta ()
	{
		$this->ctx->rh->useClass('RL_Meta');
		$meta = RL_Meta::create($this->ctx, 'Html');
		$meta->setObject($this);
		$meta->charset = $this->ctx->rh->getPreferredOutputCharset();
		return $meta;
	} // end of function buildMeta
}


